package cn.wolfcode.luowowo.mgrsite.listenner;

import cn.wolfcode.luowowo.article.domain.StrategyDetail;
import cn.wolfcode.luowowo.article.service.IStrategyDetailService;
import cn.wolfcode.luowowo.cache.domain.StrategyStatisVO;
import cn.wolfcode.luowowo.cache.service.IStrategyStatisVOService;
import cn.wolfcode.luowowo.cache.util.RedisKeys;
import cn.wolfcode.luowowo.common.util.BeanUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * redis数据初始化监听器
 * ContextRefreshedEvent 容器启动或重新加载触发的事件
 */
//@Component
public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent>{

    @Reference
    private IStrategyDetailService strategyDetailService;

    @Reference
    private IStrategyStatisVOService strategyStatisVOService;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        //当容器启动时,执行该方法
        System.out.println("--------------vo 初始化start ------- -----------");

        //将攻略数据初始化到redis中的vo对象中
        /*List<StrategyDetail> list = strategyDetailService.list();

        StrategyStatisVO vo = null;
        for (StrategyDetail detail : list){

            //这个时候有一个小的问题,就是如果多次初始化的话就会将前端的操作而没来得及进行初始化的
            //数据进行初始化的数据初始化掉,这样的话就会导致数据丢失,所有我们就要额外处理,要是存在这个数据就直接跳过
            //这时候就得判断是否有vo对象
            if (strategyStatisVOService.isStatisVoExist(detail.getId())){
                continue;
            }

            //创建vo对象
            vo = new StrategyStatisVO();
            BeanUtil.copyProperties(vo,detail);
            vo.setDestId(detail.getDest().getId());
            vo.setDestName(detail.getDest().getName());
            vo.setStrategyId(detail.getId());

            //同步redis中
            strategyStatisVOService.setStrategyStatisVo(vo);

        }*/
        //当容器结束时,执行该方法
        System.out.println("-------------  vo 初始化end-------- -----------");
        System.out.println("-------------  hot 推荐初始化 start-------- -----------");
        //这个时候要是这个项目重复启动的时候,会出现重复加分的那个的问题,,就比如说要是启动的时候是100分,
        //加到200分的时候再重启就会变成300分了,这样的话就会让数据错误了
        //所以我们要进行判断是否是有这个的,有的话就补初始化,没有再进行初始化,注意要的是的是这个前缀就可以了



        //将攻略数据初始化到redis中的vo对象中
        List<StrategyDetail> list = strategyDetailService.list();
        for (StrategyDetail detail : list){
            if (strategyStatisVOService.ISZsetStaticVOExist(RedisKeys.STRATEGY_ZSET_SORT_HOT.getPrefix(),detail.getId())){
                continue;
            }
            //阅读数＋评论数
            int score = detail.getViewnum() + detail.getReplynum();
            strategyStatisVOService.addHotScore(detail.getId(),score);
        }
        System.out.println("-------------  hot 推荐初始化  end-------- -----------");

        System.out.println("-------------  国外内推荐初始化 start-------- -----------");
        //
        for (StrategyDetail detail : list){
            if (strategyStatisVOService.ISZsetStaticVOExist(RedisKeys.STRATEGY_ZSET_SORT_COMMEND.getPrefix(),detail.getId())){
                continue;
            }

            //收藏数＋点赞数
            int score = detail.getThumbsupnum()+ detail.getFavornum();
            strategyStatisVOService.addCommendScore(detail.getId(),score);
        }
        System.out.println("-------------  国外内推荐初始化  end-------- -----------");
    }
}
